package com.android.support.lib.universal.util;

import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 时间
 * 
 * @author 彭治铭
 *
 */
public class Utiltime {

	/**
	 * 获取绝对时间(系统当前时间),
	 *
	 * @param format
	 *            时间格式，如果为空，默认格式为"yyMMddHHmmss" ,h是12小时制，H是24小时制
	 * @return
	 */
	public String getAbsoluteTime(String format) {
		SimpleDateFormat sdf;
		if (format != null && !format.equals("")) {
			sdf = new SimpleDateFormat(format);
		} else {
			sdf = new SimpleDateFormat("yyMMddHHmmss");
		}

		return sdf.format(new Date());
	}

	/**
	 * 将指定时间按指定格式输出
	 *
	 * @param calendar
	 *            指定时间
	 * @param newFormat
	 *            新格式
	 * @return
	 */
	public String getFormatTime(Calendar calendar, String newFormat) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

		SimpleDateFormat sdf2;
		if (newFormat != null && !newFormat.equals("")) {
			sdf2 = new SimpleDateFormat(newFormat);
		} else {
			sdf2 = new SimpleDateFormat("yy年MM月dd日   HH:mm:ss");
		}
		return sdf2.format(calendar.getTime());
	}

	/**
	 * 求两个日期的天数之差
	 *
	 * @param startDate
	 *            开始日期
	 * @param endDate
	 *            结束日期，一般结束日期要大于开始日期。这样算出的结果为正。
	 * @return
	 */
	public int getDistance(Calendar startDate, Calendar endDate) {
		long from = 0;
		long to = 0;
		try {
			from = startDate.getTime().getTime();
			to = endDate.getTime().getTime();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("日差计算出错");
			e.printStackTrace();
		}
		return (int) ((to - from) / (1000 * 60 * 60 * 24));
	}

	/**
	 * 获取 Calendar对象
	 *
	 * @param time
	 *            自定义时间，格式 "yyyy-MM-dd-HH-mm-ss" ,月份从 1开始，按正常运算。小时为24小时制度。
	 *            如果为空，则以当前系统时间为准。
	 * @return
	 */
	public Calendar getCalendar(String time) {
		try {
			if (time != null && !time.equals("")) {
				String strDate = time;
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd-HH-mm-ss");
				Calendar calendar = new GregorianCalendar();
				Date date = sdf.parse(strDate);
				calendar.setTime(date);
				return calendar;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return Calendar.getInstance();
	}

	/**
	 *
	 * @param year
	 *            年
	 * @param month
	 *            月，从0开始。0等于1月， 11等于12月
	 * @param day
	 *            日
	 * @param hourOfDay
	 *            时，24小时制
	 * @param minute
	 *            分钟
	 * @return
	 */
	public Calendar getCalendar(int year, int month, int day, int hourOfDay,
								int minute) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(year, month, day, hourOfDay, minute);
		return calendar;
	}

	/**
	 * 获取时间--年份
	 *
	 * @param calendar
	 *            如果为空，则已当前时间为标准
	 * @return
	 */
	public int getYear(Calendar calendar) {
		if (calendar != null) {
			return calendar.get(Calendar.YEAR);// 获取指定calendar对象的年份
		}
		return Calendar.getInstance().get(Calendar.YEAR);// 获取当前年份
	}

	/**
	 * 获得这个年的第几天
	 *
	 * @param calendar
	 *            如果为空，则已当前时间为标准
	 * @return
	 */
	public int getYearDay(Calendar calendar) {
		if (calendar != null) {
			return calendar.get(Calendar.DAY_OF_YEAR);
		}
		return Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
	}

	/**
	 * 获取时间--月份
	 *
	 * @param calendar
	 *            如果为空，则已当前时间为标准
	 * @return
	 */
	public int getMonth(Calendar calendar) {
		if (calendar != null) {
			return calendar.get(Calendar.MONTH) + 1;// 获取指定calendar对象的月份,Calendar月份从0开始。所以加1
		}
		return Calendar.getInstance().get(Calendar.MONTH) + 1;// 获取当前月份,Calendar月份从0开始。所以加1
	}

	/**
	 * 获取月份的天数,即该月份共有多少天
	 *
	 * @param calendar
	 *            如果为空，则已当前时间为标准
	 * @return
	 */
	public int getMonthDay(Calendar calendar) {
		if (calendar != null) {
			calendar.getActualMaximum(Calendar.DAY_OF_MONTH);// 获取指定calendar对象的月份共有多少天。
		}
		return Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);// 获取当前月份共有多少天。
	}

	/**
	 * 获取指定时间的月份共有多少天（含润年非润年）
	 *
	 * @param date
	 *            日期，格式为 "yyyy-MM" ,月份从1开始，按正常运算
	 * @return
	 */
	public int getMonthDay(String date) {
		int days = 0;
		try {
			String strDate = date;
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
			Calendar calendar = new GregorianCalendar();
			Date date1 = sdf.parse(strDate);
			calendar.setTime(date1); // 放入你的日期
			days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		} catch (Exception e) {
			// TODO: handle exception
		}
		return days;
	}

	/**
	 * 获取时间--日期，即几号
	 *
	 * @param calendar
	 *            如果为空，则已当前时间为标准
	 * @return
	 */
	public int getDay(Calendar calendar) {
		if (calendar != null) {
			return calendar.get(Calendar.DATE);// 获取指定calendar对象的日期，即 几号
		}
		return Calendar.getInstance().get(Calendar.DATE);// 获取当前日期，即 几号
	}

	/**
	 * 获取时间--小时
	 *
	 * @param calendar
	 *            如果为null,则以当前时间为标准
	 * @param hour
	 *            参数传12，返回12制度。 传其他任何数，都返回24制度。
	 * @return
	 */
	public int getHour(Calendar calendar, int hour) {
		if (calendar != null) {
			if (hour == 12) {
				return calendar.get(Calendar.HOUR);// 12小时制度;
			}
			return calendar.get(Calendar.HOUR_OF_DAY);// 24小时制度
		}
		if (hour == 12) {
			return Calendar.getInstance().get(Calendar.HOUR);// 12小时制度;
		}
		return Calendar.getInstance().get(Calendar.HOUR_OF_DAY);// 24小时制度
	}

	/**
	 * 获取时间--分钟
	 *
	 * @param calendar
	 *            如果为null,则已当前的时间为标准
	 * @return
	 */
	public int getMinute(Calendar calendar) {
		if (calendar != null) {
			return calendar.get(Calendar.MINUTE);// 分;
		}
		return Calendar.getInstance().get(Calendar.MINUTE);// 分;
	}

	/**
	 * 获取时间--秒
	 *
	 * @param calendar
	 *            如果为null,则已当前时间为标准
	 * @return
	 */
	public int getSecond(Calendar calendar) {
		if (calendar != null) {
			calendar.get(Calendar.SECOND);// 秒;
		}
		return Calendar.getInstance().get(Calendar.SECOND);// 秒;
	}

	/**
	 * 获取时间--星期
	 *
	 * @param calendar
	 *            如果为null,则已当前时间为标准
	 * @return
	 */
	public String getWeek(Calendar calendar) {
		String[] week = new String[] { "星期日", "星期一", "星期二", "星期三", "星期四",
				"星期五", "星期六" };
		if (calendar != null) {

			return week[calendar.get(Calendar.DAY_OF_WEEK) - 1];// 国外是从星期天为第一天。中国是星期一为第一天，所以减去1
		}
		return week[Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1];// 国外是从星期天为第一天。中国是星期一为第一天，所以减去1
	}

	/**
	 * 获取时间毫秒数。即时间的毫秒总计。
	 *
	 * @param calendar
	 *            如果为null,则已当前时间为标准
	 * @return
	 */
	public long getTimeMillis(Calendar calendar) {
		if (calendar != null) {
			return calendar.getTimeInMillis();
		}
		return Calendar.getInstance().getTimeInMillis();// 获得当前时间的毫秒表示
	}

	/**
	 * 时间加减
	 *
	 * @param calendar
	 * @param year
	 *            年份加减 ，正数加，负数减。
	 * @param month
	 *            月份加减
	 * @param day
	 *            日期加减
	 * @return
	 */
	public Calendar subtracDate(Calendar calendar, int year, int month, int day) {
		calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year);// 年份加减
		calendar.set(calendar.MONTH, calendar.get(Calendar.MONTH) + month);// 月份加减
		calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH)
				+ day);// 日期加减
		return calendar;
	}

	/**
	 * 与当前时间比较大小。
	 *
	 * @param calendar
	 * @return true 大于当前时间，false小于当前时间
	 */
	public Boolean before(Calendar calendar) {
		return Calendar.getInstance().before(calendar);// 当前时间是否在传入时间之前，true，则大于当前时间，false,小于当前时间。
	}

	/**
	 * 获取年龄
	 *
	 * @param birth
	 *            出生日期，Calendar对象
	 * @return
	 */
	public int getAge(Calendar birth) {
		Calendar cal = Calendar.getInstance();
		// 当前时间
		int yearNow = cal.get(Calendar.YEAR);
		int monthNow = cal.get(Calendar.MONTH) + 1;// 注意此处，如果不加1的话计算结果是错误的
		int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);

		// 出生时间
		int yearBirth = birth.get(Calendar.YEAR);
		int monthBirth = birth.get(Calendar.MONTH) + 1;
		int dayOfMonthBirth = birth.get(Calendar.DAY_OF_MONTH);

		int age = yearNow - yearBirth;

		if (monthNow == monthBirth) {

			if (dayOfMonthNow < dayOfMonthBirth) {
				age--;
			}

		} else if (monthNow < monthBirth) {
			age--;
		}

		return age;
	}

	/**
	 * 与当前时间作比较，仿QQ聊天记录时间显示。
	 *
	 * @param startDate
	 *            日期。不能大于当前日期。
	 * @return
	 */
	public String getRelativeCurrentTime(Calendar startDate) {
		try {
			Calendar endDate = Calendar.getInstance();// 当前日期

			int distence = getDistance(startDate, endDate);
			if (distence < 7) {
				if (distence <= 1) {
					if (distence == 0) {// 显示今天
						return getFormatTime(startDate, "HH:mm");
					} else {// 显示昨天
						return getFormatTime(startDate, "昨天 HH:mm");
					}
				} else {// 显示星期
					return getWeek(startDate)
							+ getFormatTime(startDate, " HH:mm");
				}

			} else {// 日差大于七，显示月份日期
				return getFormatTime(startDate, "MM-dd HH:mm");
			}

		} catch (Exception e) {
			Log.e("test", "相对时间出错" + e.getMessage());
		}

		return "";
	}
}
